﻿namespace hercules.Models.Negocio
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


    using hercules.Models.Dados;

    public class NegocioProdutoCompra
    {
         /// <summary>
        /// Objeto genérico que faz a persistência dos dados.
        /// </summary>
        private readonly IRepositorioGenerico<ProdutoCompra, ControleEstoqueEntities> repositorioProdutoCompra;

        /// <summary>
        /// Initializes a new instance of the <see cref="NegocioProdutoVenda"/> class.
        /// Construtor para inicializar os atributos.
        /// </summary>
        public NegocioProdutoCompra()
        {
            this.repositorioProdutoCompra = new RepositorioGenerico<ProdutoCompra, ControleEstoqueEntities>("chave");
        }

        /// <summary>
        /// Método para fazer a inserção de produtoVenda.
        /// </summary>
        /// <param name="produtoVenda">Objeto que irá ser persistido</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Inserir(ProdutoCompra produtoCompra)
        {
            this.repositorioProdutoCompra.Inserir(produtoCompra);
            return this.repositorioProdutoCompra.SaveChanges() > 0;
        }

        /// <summary>
        /// Método para fazer a alteração de produtoVenda.
        /// </summary>
        /// <param name="objeto">Objeto que terá seus dados alterados</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Editar(ProdutoCompra objeto)
        {
            ProdutoCompra produtoCompra = this.Obter(objeto.numeroNota);
            produtoCompra.idProduto = objeto.idProduto;
            produtoCompra.preco = objeto.preco;
            produtoCompra.quantidade = objeto.quantidade;

            return this.repositorioProdutoCompra.SaveChanges() > 0;
        }

        /// <summary>
        /// Método para remover um produtoVenda utilizando o número da nota da venda.
        /// </summary>
        /// <param name="numNota">Número da nota que será removido.</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Remover(int numNota)
        {
            this.repositorioProdutoCompra.Remover(produtoCompra => produtoCompra.numeroNota == numNota);
            return this.repositorioProdutoCompra.SaveChanges() > 0;
        }

        /// <summary>
        /// Método que retorna uma lista com todos os produtoVendas.
        /// </summary>
        /// <returns>A lista com os produtoVendas.</returns>
        public List<ProdutoCompra> ObterTodos()
        {
            return this.repositorioProdutoCompra.ObterTodos().ToList();
        }

        /// <summary>
        /// Método que retorna um produtoVenda passando o número da nota.
        /// </summary>
        /// <param name="numNota">Número da nota do produto da venda a ser retornado.</param>
        /// <returns>O produtoVenda desejado.</returns>
        public ProdutoCompra Obter(int numNota)
        {
            return this.repositorioProdutoCompra.ObterEntidade(produtoCompra => produtoCompra.numeroNota == numNota);
        }

        /// <summary>
        /// Método para fazer a comparação entre dois produtos da venda.
        /// </summary>
        /// <param name="produtoVenda1">Primeiro produto da Venda.</param>
        /// <param name="produtoVenda2">Segundo produto da Venda.</param>
        /// <returns>True se eles forem iguais, caso contrário false.</returns>
        public bool Equals(ProdutoCompra produtoCompra1, ProdutoVenda produtoCompra2)
        {
            if (produtoCompra1.numeroNota.Equals(produtoCompra2.numeroNota) &&
                produtoCompra1.idProduto.Equals(produtoCompra2.idProduto) &&
                produtoCompra1.quantidade.Equals(produtoCompra2.quantidade) && 
                produtoCompra1.preco.Equals(produtoCompra2.preco))
            {
                return true;
            }

            return false;
        }
    }
}
    
